/**
 * @param {number[][]} costs
 * @return {number}
 * @description 0为红色的费用 1为蓝色的费用 2为绿色的费用
 */

var minCost = function (costs) {
    // 处理边界情况
    if (!costs || !costs.length) return 0
    // 缓存房子的个数
    const len = costs.length
    // 初始化状态数组（二维）
    const f = new Array(len)
    for (let i = 0; i < len; i++) {
        f[i] = new Array(3)
    }
    // 初始化状态值
    f[0][0] = costs[0][0]
    f[0][1] = costs[0][1]
    f[0][2] = costs[0][2]
    // 开始更新刷到每一个房子时的状态值
    for (let i = 1; i < len; i++) {
        // 更新刷到当前房子时，给当前房子选用第0种油漆对应的最小总价
        f[i][0] = Math.min(f[i - 1][1], f[i - 1][2]) + costs[i][0]
        // 更新刷到当前房子时，给当前房子选用第1种油漆对应的最小总价
        f[i][1] = Math.min(f[i - 1][2], f[i - 1][0]) + costs[i][1]
        // 更新刷到当前房子时，给当前房子选用第2种油漆对应的最小总价
        f[i][2] = Math.min(f[i - 1][1], f[i - 1][0]) + costs[i][2]
    }
    // 返回刷到最后一个房子时，所有可能出现的总价中的最小值
    return Math.min(f[len - 1][0], f[len - 1][1], f[len - 1][2])
};